package clasificador.genetico.reglas;

import java.util.Map;

import datos.AtributoFinito;

/* Simplemente un agrupador del conjunto de parametros que definen una semantica de conjuntos de reglas */
public class ParametrosConjuntoReglas<Clase> {
	/* Esto son arrays precalculados que asignan un orden concreto a la cadena. */
	public AtributoFinito<?>[] ordenAtributos;
	/* Esto es un mapa porque es mas eficiente de buscar, teoricamente. Sino, habria que recorrer el array de cada atributo buscando el valor del dato. */
	public Map<?,Integer>[] ordenValoresAtributos;
	public Integer[] numValoresAtributos;
	public Clase[] ordenClases;
	public int lenRegla;
	
	private int calcularLenRegla(AtributoFinito<?>[] ordenAtributos, Map<?,Integer>[] ordenValoresAtributos, Clase[] ordenClases)
	{
		/* Calculamos la longitud de una regla */		
		int lenRegla = 0;
		for(int i = 0; i < ordenAtributos.length; i++)
		{			
			lenRegla += ordenValoresAtributos[i].keySet().size();
		}
		/* La parte de la clase se hace, por simplicidad, de la misma manera; pero solo uno de los bits podra valer 1 */ 
		lenRegla += ordenClases.length;
		
		return lenRegla;
	}
	
	private Integer[] calcularNumValoresAtributos(AtributoFinito<?>[] ordenAtributos, Map<?,Integer>[] ordenValoresAtributos, Clase[] ordenClases)
	{
		Integer[] numValoresAtributos = new Integer[ordenAtributos.length];
		
		for(int i = 0; i < ordenAtributos.length; i++)
		{			
			numValoresAtributos[i] =  ordenValoresAtributos[i].keySet().size();
		}
		
		return numValoresAtributos;
	}
	
	public ParametrosConjuntoReglas(AtributoFinito<?>[] ordenAtributos, Map<?,Integer>[] ordenValoresAtributos, Clase[] ordenClases)
	{
		this.lenRegla = calcularLenRegla(ordenAtributos,ordenValoresAtributos,ordenClases);
		this.numValoresAtributos = calcularNumValoresAtributos(ordenAtributos,ordenValoresAtributos,ordenClases);
	}
	
}
